package com.zf.powerjob.worker.utils;

import org.apache.commons.lang3.StringUtils;
import tech.powerjob.worker.core.processor.TaskContext;

import java.util.Map;

/**
 * PowerJob工具类
 *
 * @author Zhou Feng
 */
public class PowerJobUtils {
    public static final String NULL_STR = "null";
    public static final String CONTEXT_INIT_PARAMS_KEY = "initParams";

    /**
     * 当任务在工作流中运行时，获取工作流的上下文
     */
    public static Map<String, String> getWorkflowContextData(TaskContext context) {
        // 工作流上下文中的内容
        return context.getWorkflowContext().getData();
    }


    /**
     * 获取任务参数，优先级从高到底： 任务实例参数 -> 任务的定义参数
     * <pre>
     * 一、当前运行的是工作流，任务在工作流中运行时：
     *      1、当没有给工作流传递参数时:
     *               TaskContext.getWorkflowContext().getData() 获取的工作流参数是 【{}】；
     *               TaskContext.getInstanceParams() 获取的参数是【null】；
     *               TaskContext.getJobParams() 获取的参数是 【先取任务节点配置的参数值，如果没有配置，则取任务定义中的参数值】
     *
     *      2、当给工作流传递参数，且格式不符合json格式时，实例参数的值就等于工作流的上下文，PowerJob内部代码判定 【 {"key":"value"}、 [{"key":"value"}] 】格式才是json, 【 ["aa","bb"]、[]、[{}]、[{},{}]、{} 】格式不是json
     *               TaskContext.getWorkflowContext().getData() 获取的工作流参数是 【 {"initParams":"工作流传参"} 】；
     *               TaskContext.getInstanceParams() 获取的参数是【 {"initParams":"工作流传参"} 】；
     *               TaskContext.getJobParams() 获取的参数是 【先取任务节点配置的参数值，如果没有配置，则取任务定义中的参数值】
     *
     *      3、当给工作流传递参数，且格式是json格式时，实例参数的值就等于工作流的上下文
     *               TaskContext.getWorkflowContext().getData() 获取的工作流参数是 【 工作流传参 】；
     *               TaskContext.getInstanceParams() 获取的参数是【 工作流传参 】；
     *               TaskContext.getJobParams() 获取的参数是 【先取任务节点配置的参数值，如果没有配置，则取任务定义中的参数值】
     *
     * 二、当前运行的是单个任务，任务不在工作流中运行时
     *      TaskContext.getWorkflowContext().getData() 获取的工作流参数是 【 {} 】；
     *      TaskContext.getInstanceParams() 获取的参数是【 运行时传递的参数 】；
     *      TaskContext.getJobParams() 获取的参数是 【任务定义中的参数值】
     * </pre>
     */
    public static String getTaskParam(TaskContext context) {
        // 先获取实例参数，
        String instanceParams = context.getInstanceParams();
        // 如果任务实例参数不空，则返回任务实例参数
        if (StringUtils.isNotBlank(instanceParams)) {
            return instanceParams;
        }

        // 如果没有任务实例参数，则返回任务的定义参数
        String jobParams = context.getJobParams();
        // 如果任务的定义参数不空，则返回任务的定义参数
        if (StringUtils.isNotBlank(jobParams)) {
            return jobParams;
        }
        return "";
    }
}
